package config

import (
	"encoding/json"
	"os"
	"regexp"
	"strings"
)

// TriangleConfig 三角套利策略设置
type TriangleConfig struct {
	// PriceExpireLimit 价格过期时间
	PriceExpireLimit int64 `json:"price_expire_limit"`
	// TradeExpireSec 交易超时时间
	TradeExpireSec int64 `json:"trade_expire_sec"`
	// VolPerTrade 每次交易的占资金总量的百分比
	VolPerTrade float64 `json:"vol_per_trade"`
	// EarnPerTrade 三角套利盈利限制（单位百分比，必须高于此值才进行套利操作）
	EarnPerTrade float64 `json:"earn_per_trade"`
	// 交易对的每分钟交易量最小值，必须高于此值猜进行套利操作
	TradeCountMin int `json:"trade_count_min"`
	// ThreadCount 三角套利主线程数
	ThreadCount int `json:"thread_count"`
}

// AmountLimit 交易金额限制
type AmountLimit struct {
	Currency string  `json:"currency"`
	Max      float64 `json:"max"`
	Min      float64 `json:"min"`
}

// TraderConfig 交易策略设置
type TraderConfig struct {
	Triangle         TriangleConfig         `json:"triangle"`
	TradeAmountLimit map[string]AmountLimit `json:"trade_amount_limit"`
	LossLimitPer     float64                `json:"loss_limit_per"`
}

// RPCConfig 微服务配置文件
type RPCConfig struct {
	Name string `json:"name"`
	// Addr 绑定IP地址
	// 127.0.0.1 本地访问，0.0.0.0互联网访问
	Addr    string        `json:"addr"`
	Port    string        `json:"port"`
	Mod     string        `string:"mode"`
	MongoDB NoSQLDBConfig `json:"mongo"`
	Trader  TraderConfig  `json:"trader"`
	// Goex    GoexConf      `json:"goex"`
	Log LogConfig `json:"log"`
}

const (
	defaultRPCConfPath = "./config.json"
)

// RPCServerConfig 服务配置实例
var RPCServerConfig RPCConfig

var rpcInited = false

// InitRPCConfig 初始化服务配置
func InitRPCConfig(path interface{}) *RPCConfig {
	var file *os.File
	var err error
	switch path.(type) {
	case string:
		_, err = os.Stat(path.(string))
		if err == nil {
			file, err = os.Open(path.(string))
		} else {
			file, err = os.Open(defaultRPCConfPath)
		}
	default:
		file, err = os.Open(defaultRPCConfPath)
	}
	if err != nil {
		panic(err.Error())
	}

	decoder := json.NewDecoder(file)
	RPCServerConfig = RPCConfig{}
	err = decoder.Decode(&RPCServerConfig)
	if err != nil {
		panic(err.Error())
	}
	rpcInited = true
	return &RPCServerConfig
}

// IsRPCInited 是否初始化配置
func IsRPCInited() bool {
	return rpcInited
}

// IsRPCDebug 是否开发模式
func (c *RPCConfig) IsRPCDebug() bool {
	ret, _ := regexp.MatchString("^dev", strings.ToLower(c.Mod))
	return ret
}

// // IsGoexTest 是否测试模式
// func (c *RPCConfig) IsGoexTest() bool {
// 	ret, _ := regexp.MatchString("^test", strings.ToLower(c.Goex.Mode))
// 	return ret
// }

// // GetRPCConf 获取RPC设置对象
// func GetRPCConf() *RPCConfig {
// 	if IsRPCInited() {
// 		return &RPCServerConfig
// 	}
// 	return nil
// }

// // GetRPCGoex 返回Goex设置对象
// func GetRPCGoex() *GoexConf {
// 	if IsRPCInited() {
// 		return &RPCServerConfig.Goex
// 	}
// 	return nil
// }

// // IsMainCoin 判断币种是否为主要币种
// func IsMainCoin(coin goex.Currency) bool {
// 	coinName := coin.String()
// 	for _, k := range RPCServerConfig.Goex.MainCoins {
// 		if coinName == k {
// 			return true
// 		}
// 	}
// 	return false
// }

// // IsBaseCoin 判断币种是否为基础币种
// func IsBaseCoin(coin goex.Currency) bool {
// 	coinName := coin.String()
// 	return coinName == RPCServerConfig.Goex.BaseCoin
// }

// // GetBaseCoin 获取基础货币
// func GetBaseCoin() goex.Currency {
// 	return goex.Currency{
// 		Symbol: RPCServerConfig.Goex.BaseCoin,
// 		Desc:   ""}
// }
